#pragma once

#include <vector>
#include "../txr_algo_dlm_rec/txr_algo_dlm_rec_define.h"
#include "common\define.h"
// #include "NvInfer.h"
// #include "cuda_img_resize.cuh"

#include "opencv2/opencv.hpp"
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
#include "openvino/openvino.hpp"

namespace txr_algo_dlm_rec
{
	// 检测结果
	struct DetectRes2 
	{
		int classes;    // 类别
		float prob;     // 概率
	};

	class Rec_Container
	{
		#define DATS_EXTENSION ".orec1"

		public:
			Rec_Container();
			~Rec_Container();
		
			// 初始化
			bool Init(int gpu_id, const char* hdats_path);

			// 获取批大小
			int BatchSize();

			// 检测
			void Detect(st_dlm_data* p_imgs, int num, std::vector<st_result_info> &v_results);

			// 获取最大值索引
			template <class ForwardIterator>
			inline static size_t argmax(ForwardIterator first, ForwardIterator last) {
				return std::distance(first, std::max_element(first, last));
			}

			// 预处理图像
			void prepareImage(st_dlm_data* p_imgs, int num, std::vector<std::vector<float>>& processed_data);

		private:
			// 重置资源
			void Reset();

			// 加载引擎
			bool LoadEngine(std::vector<char> v_engine_data);

			// 后处理
			std::vector<st_result_info> postProcess(st_dlm_data* p_imgs, int num, float* output, const int outSize);
			
			st_encrypt_info_ovino m_info;                                    // 加密信息
			int m_out_size = 0;

			ov::Core core;
			ov::CompiledModel compiled_model;
			std::vector<ov::InferRequest> infer_requests;
			std::vector<ov::Tensor> m_v_tensors;

			std::vector<float> m_v_out_buf;                          // 输出缓冲区
			std::vector<int> m_v_predict_shape;                      // 预测形状
	};

}//namespace txr_algo_dlm_rec